package com.demo.java.OD101_150.OD143;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【打印文件】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145734168
 */
public class OdMain {
    public static void main(String[] args) {
        // 创建一个List，包含5个优先级队列，存储文档信息
        List<List<Document>> fileMap = new ArrayList<>(5);
        // 初始化每个优先级队列为空
        for (int i = 0; i < 5; i++) {
            fileMap.add(new ArrayList<>());
        }

        // 使用Scanner读取输入
        try (Scanner scanner = new Scanner(System.in)) {
            // 获取操作的次数
            int numberOfOperations = scanner.nextInt();
            int flag = 0;  // 用于记录文档的索引

            // 遍历操作次数
            for (int i = 0; i <= numberOfOperations; i++) {
                // 读取输入的每一行操作
                String s = scanner.nextLine();
                // 将输入字符串按空格分割，获取操作类型及相关参数
                String[] s1 = s.split(" ");
                String type = s1[0];  // 获取操作类型 (IN 或 OUT)

                // 根据操作类型进行相应处理
                switch (type) {
                    // 如果操作类型是 "IN"
                    case "IN":
                        // 获取文件的优先级和权重
                        int filePriority = Integer.parseInt(s1[1]);
                        int fileWeight = Integer.parseInt(s1[2]);
                        flag++; // 增加文件索引
                        // 创建一个新的Document对象，保存文档的索引和权重
                        Document document = new Document(flag, fileWeight);
                        // 获取对应优先级的文档队列
                        List<Document> documents = fileMap.get(filePriority - 1);
                        // 将文档添加到该优先级队列中
                        documents.add(document);
                        break;

                    // 如果操作类型是 "OUT"
                    case "OUT":
                        // 获取需要操作的优先级
                        int priority = Integer.parseInt(s1[1]);
                        // 获取该优先级的文档队列
                        List<Document> docs = fileMap.get(priority - 1);

                        // 如果该优先级队列不为空
                        if (!docs.isEmpty()) {
                            // 按文档权重降序排序（最重的文档在最前面）
                            Collections.sort(docs, Comparator.comparing(Document::getWeight).reversed());
                            // 获取最重的文档（队列中的第一个文档）
                            Document doc = docs.get(0);
                            // 输出该文档的索引
                            System.out.println(doc.getIndex());
                            // 移除该文档
                            docs.remove(0);
                        } else {
                            // 如果该优先级队列为空，输出 "NULL"
                            System.out.println("NULL");
                        }
                        break;

                    // 其他操作类型暂不处理
                    default:
                        break;
                }
            }
        }
    }
}

// 文件类，用于存储文件的编号和重量
class Document {
    private int index;  // 文档的索引
    private int weight;  // 文档的权重

    // 构造函数，初始化文档的索引和权重
    public Document(int index, int weight) {
        this.index = index;
        this.weight = weight;
    }

    // 获取文档的索引
    public int getIndex() {
        return index;
    }

    // 设置文档的索引
    public void setIndex(int index) {
        this.index = index;
    }

    // 获取文档的权重
    public int getWeight() {
        return weight;
    }

    // 设置文档的权重
    public void setWeight(int weight) {
        this.weight = weight;
    }
}

